--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 247db32033d6de6059e1593d05d5dcb6841c887b
Parents : d8a35be
Author : Mark Qvist <mark@unsigned.io>
Date : 2022-07-04T19:25:17+02:00
Added LXMF link support
Changes
5 files changed, 89 insertions(+), 21 deletions(-)
Diff
diff --git a/nomadnet/Conversation.py b/nomadnet/Conversation.py
index 6d66219..94f2697 100644
--- a/nomadnet/Conversation.py
+++ b/nomadnet/Conversation.py
@@ -239,10 +239,11 @@ class Conversation:
def __str__(self):
string = self.source_hash
- if self.source_identity:
- if self.source_identity.app_data:
- # TODO: Sanitise for viewing
- string += " | "+self.source.source_identity.app_data.decode("utf-8")
+ # TODO: Remove this
+ # if self.source_identity:
+ # if self.source_identity.app_data:
+ # # TODO: Sanitise for viewing, or just clean this
+ # string += " | "+self.source_identity.app_data.decode("utf-8")
return string
diff --git a/nomadnet/Directory.py b/nomadnet/Directory.py
index 740fd4f..a2d9e79 100644
--- a/nomadnet/Directory.py
+++ b/nomadnet/Directory.py
@@ -60,8 +60,6 @@ class Directory:
entries = {}
for e in unpacked_list:
- if e[1] == None:
- e[1] = RNS.prettyhexrep(e[0])
if len(e) > 3:
hosts_node = e[3]
@@ -250,8 +248,9 @@ class DirectoryEntry:
if len(source_hash) == RNS.Identity.TRUNCATED_HASHLENGTH//8:
self.source_hash = source_hash
- if display_name == None:
- display_name = source_hash
+ # TODO: Clean
+ # if display_name == None:
+ # display_name = source_hash
self.display_name = display_name
diff --git a/nomadnet/ui/textui/Browser.py b/nomadnet/ui/textui/Browser.py
index fbe4826..bdecffe 100644
--- a/nomadnet/ui/textui/Browser.py
+++ b/nomadnet/ui/textui/Browser.py
@@ -133,17 +133,82 @@ class Browser:
self.browser_footer = urwid.AttrMap(urwid.Pile([urwid.Divider(self.g["divider1"]), urwid.Text("Link to: "+str(link_target))]), "browser_controls")
self.frame.contents["footer"] = (self.browser_footer, self.frame.options())
+ def expand_shorthands(self, destination_type):
+ if destination_type == "nnn":
+ return "nomadnetwork.node"
+ elif destination_type == "lxmf":
+ return "lxmf.delivery"
+ else:
+ return destination_type
+
def handle_link(self, link_target):
- if self.status >= Browser.DISCONECTED:
- RNS.log("Browser handling link to: "+str(link_target), RNS.LOG_DEBUG)
+ components = link_target.split("@")
+ destination_type = None
+
+ if len(components) == 2:
+ destination_type = self.expand_shorthands(components[0])
+ link_target = components[1]
+ else:
+ destination_type = "nomadnetwork.node"
+ link_target = components[0]
+
+ if destination_type == "nomadnetwork.node":
+ if self.status >= Browser.DISCONECTED:
+ RNS.log("Browser handling link to: "+str(link_target), RNS.LOG_DEBUG)
+ try:
+ self.retrieve_url(link_target)
+ except Exception as e:
+ self.browser_footer = urwid.Text("Could not open link: "+str(e))
+ self.frame.contents["footer"] = (self.browser_footer, self.frame.options())
+ else:
+ RNS.log("Browser already handling link, cannot handle link to: "+str(link_target), RNS.LOG_DEBUG)
+
+ elif destination_type == "lxmf.delivery":
+ RNS.log("Passing LXMF link to handler", RNS.LOG_DEBUG)
+ self.handle_lxmf_link(link_target)
+
+ else:
+ RNS.log("No known handler for destination type "+str(destination_type), RNS.LOG_DEBUG)
+ self.browser_footer = urwid.Text("Could not open link: "+"No known handler for destination type "+str(destination_type))
+ self.frame.contents["footer"] = (self.browser_footer, self.frame.options())
+
+ def handle_lxmf_link(self, link_target):
+ try:
+ if not type(link_target) is str:
+ raise ValueError("Invalid data type for LXMF link")
+
+ if len(link_target) != (RNS.Reticulum.TRUNCATED_HASHLENGTH//8)*2:
+ raise ValueError("Invalid length for LXMF link")
+
try:
- self.retrieve_url(link_target)
+ bytes.fromhex(link_target)
+
except Exception as e:
- self.browser_footer = urwid.Text("Could not open link: "+str(e))
- self.frame.contents["footer"] = (self.browser_footer, self.frame.options())
- else:
- RNS.log("Browser aleady hadling link, cannot handle link to: "+str(link_target), RNS.LOG_DEBUG)
+ raise ValueError("Could not decode destination hash from LXMF link")
+
+ existing_conversations = nomadnet.Conversation.conversation_list(self.app)
+
+ source_hash_text = link_target
+ display_name_data = RNS.Identity.recall_app_data(bytes.fromhex(source_hash_text))
+
+ display_name = None
+ if display_name_data != None:
+ display_name = display_name_data.decode("utf-8")
+
+ if not source_hash_text in [c[0] for c in existing_conversations]:
+ entry = DirectoryEntry(bytes.fromhex(source_hash_text), display_name=display_name)
+ self.app.directory.remember(entry)
+
+ new_conversation = nomadnet.Conversation(source_hash_text, nomadnet.NomadNetworkApp.get_shared_instance(), initiator=True)
+ self.app.ui.main_display.sub_displays.conversations_display.update_conversation_list()
+ self.app.ui.main_display.sub_displays.conversations_display.display_conversation(None, source_hash_text)
+ self.app.ui.main_display.show_conversations(None)
+
+ except Exception as e:
+ RNS.log("Error while starting conversation from link. The contained exception was: "+str(e), RNS.LOG_ERROR)
+ self.browser_footer = urwid.Text("Could not open LXMF link: "+str(e))
+ self.frame.contents["footer"] = (self.browser_footer, self.frame.options())
def micron_released_focus(self):
diff --git a/nomadnet/ui/textui/Guide.py b/nomadnet/ui/textui/Guide.py
index 0e4cdc6..fe6324b 100644
--- a/nomadnet/ui/textui/Guide.py
+++ b/nomadnet/ui/textui/Guide.py
@@ -929,11 +929,11 @@ Here's a few examples:
`Faaa
`=
-Here is a link without any label: `[1385edace36466a6b3dd:/page/index.mu]
+Here is a link without any label: `[72914442a3689add83a09a767963f57c:/page/index.mu]
-This is a `[labeled link`1385edace36466a6b3dd:/page/index.mu] to the same page, but it's hard to see if you don't know it
+This is a `[labeled link`72914442a3689add83a09a767963f57c:/page/index.mu] to the same page, but it's hard to see if you don't know it
-Here is `F00a`_`[a more visible link`1385edace36466a6b3dd:/page/index.mu]`_`f
+Here is `F00a`_`[a more visible link`72914442a3689add83a09a767963f57c:/page/index.mu]`_`f
`=
``
@@ -941,11 +941,11 @@ The above markup produces the following output:
`Faaa`B333
-Here is a link without any label: `[1385edace36466a6b3dd:/page/index.mu]
+Here is a link without any label: `[72914442a3689add83a09a767963f57c:/page/index.mu]
-This is a `[labeled link`1385edace36466a6b3dd:/page/index.mu] to the same page, but it's hard to see if you don't know it
+This is a `[labeled link`72914442a3689add83a09a767963f57c:/page/index.mu] to the same page, but it's hard to see if you don't know it
-Here is `F00f`_`[a more visible link`1385edace36466a6b3dd:/page/index.mu]`_`f
+Here is `F00f`_`[a more visible link`72914442a3689add83a09a767963f57c:/page/index.mu]`_`f
``
diff --git a/nomadnet/ui/textui/Network.py b/nomadnet/ui/textui/Network.py
index 658feba..9ea6a5c 100644
--- a/nomadnet/ui/textui/Network.py
+++ b/nomadnet/ui/textui/Network.py
@@ -420,6 +420,9 @@ class KnownNodeInfo(urwid.WidgetWrap):
addr_str = "<"+RNS.hexrep(source_hash, delimit=False)+">"
+ if display_str == None:
+ display_str = addr_str
+
if node_ident != None:
lxmf_addr_str = g["sent"]+" LXMF Propagation Node Address is "+RNS.prettyhexrep(RNS.Destination.hash_from_name_and_identity("lxmf.propagation", node_ident))
else:
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────